package com.rad.net.protocol.android.encoder;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.rad.net.protocol.common.annotation.Alias;

/**
 * 类说明：属性值域类，属性包含了字段对象，set方法对象和get方法对象
 * @author xinhui.cheng
 * @date 2014-8-20
 * @version 1.0
 */
public class FieldInfo {

	private Field field;
	private Method setMethod;
	private Method getMethod;

	/**
	 * 获取字段对象
	 * @return 字段对象
	 */
	public Field getField() {
		return field;
	}

	/**
	 * 设置字段对象
	 * @param field 字段对象
	 */
	public void setField(Field field) {
		this.field = field;
	}

	/**
	 * 获取 set 方法的方法对象
	 * @return 方法对象
	 */
	public Method getSetMethod() {
		return setMethod;
	}

	/**
	 * 设置 set 方法的方法对象
	 * @param setMethod 方法对象
	 */
	public void setSetMethod(Method setMethod) {
		this.setMethod = setMethod;
	}

	/**
	 * 获取 get 方法的方法对象
	 * @return  方法对象
	 */
	public Method getGetMethod() {
		return getMethod;
	}

	/**
	 * 设置 get 方法的方法对象
	 * @param getMethod 方法对象
	 */
	public void setGetMethod(Method getMethod) {
		this.getMethod = getMethod;
	}
	/**
	 * 获取属性值
	 * @param bean 指定的对象
	 * @return 返回结果或null
	 */
	public Object getAttribute(Object bean){
		try {			 
			Method get = getGetMethod();
			Object r=get.invoke(bean);
			return r;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取字段对象名称
	 * @return 字段名称
	 */
	public String getFieldName() {
		return field.getName();
	}
	
	/**
	 * 获取别名
	 * @return 如果没有别名则返回原名
	 */
	public String getAlias(){
		Alias alias = field.getAnnotation(Alias.class);
		if(alias == null){
			return getFieldName();
		} 
		return alias.value();
	}

}
